2.5.2节练习
练习2.33:利用本节定义的变量,判断下列语句的运行结果。
a = 42; b = 42; c = 42;
d = 42; e = 42; g = 42;
出题思路:
本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。首先,使用引用其实是使用引用的对象,所以当引用被用作初始值时,真正参与初始化的其实是引用对象的值,编译器以引用对象的类型作为auto的推类型。其次,auto一般会忽略掉顶层const,同时保留底层const。
解答:
前3条赋值是合法的,原因如下:
r是i的别名,而i是一个整数,所以a的类型推断结果是一个整数;ci是一个整型常量,在类型推断时顶层const被忽略掉了,所以b是一个整数;cr是ci的别名,而ci是一个整型常量,所以c的类型推断结果是一个整数。因为a、b、c都是整数,所以为其赋值42是合法的。
后3条赋值语句是非法的,原因如下:
i是一个整数,&i是i的地址,所以d的类型推断结果是一个整型指针;ci是一个整型常量,&ci是一个整型常量的地址,所以e的类型推断结果是一个指向整型常量的指针;ci是一个整型常量,所以g的类型推断结果是一个整型常量引用。因为d和e都是指针,所以不能直接用字面值常量为其赋值;g绑定到了整型常量,所以不能修改它的值。
练习2.34:基于上一个练习中的变量和语句编写一段程序,输出赋值前后变量的内容,你刚才的推断正确吗?如果不对,请反复研读本节的示例直到你明白错在何处为止。
出题思路:本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。
解答:
基于上一个练习中的变量和语句编写的程序如下所示:
#include <iostream>
int main()
{
int i = 0 &r = i;
auto a = r; // a是一个整数(r是i的别名,而i是个整数)
const int ci = i &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; // e是一个指向整型常量的指针(对常量对象取地址是一种底层const)
auto &g = ci; // g是一个整型常量引用,绑定到ci
std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << g << std::endl;
a = 42;
b = 42;
c = 42;
d = 42; // 错误:d是一个指针,赋值非法
e = 42; // 错误:e是一个指针,赋值非法
g = 42; // 错误:g是一个常量引用,赋值非法
std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << g << std::endl;
return 0;
}
程序的输出结果是:
0 0 0 0x28fedc 0x28fed8 0
42 42 42 0x28fedc 0x28fed8 0
练习2.35:判断下列定义推断出的类型是什么,然后编写程序进行验证。
const int i = 42;
auto j = i; const auto &k = i; auto *p = &i;
const auto j2 = i &k2 = i;
出题思路:本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。
解答:由题意可知,i是一个整型常量,j的类型推断结果是整数,k的类型推断结果是整型常量,p的类型推断结果是指向整型常量的指针,j2的类型推断结果是整数,k2的类型推断结果是整数。
用于验证的程序是:
#include <iostream>
$include <typeinfo>
int main()
{
const int i = 42;
auto j = i;
const auto &k = i;
auto *p = &i;
const auto j2 = i &k = i;
atd::cout << typeid(i).name() << std::endl;
atd::cout << typeid(j).name() << std::endl;
atd::cout << typeid(k).name() << std::endl;
atd::cout << typeid(p).name() << std::endl;
atd::cout << typeid(j2).name() << std::endl;
atd::cout << typeid(k2).name() << std::endl;
return 0;
}
普通的冒险故事提示您:看后求收藏(卧龙小说网http://www.wolongxs.com),接着再看更方便。
好书推荐:《我的剧本世界在自主运行》、《我是舰娘》、《交错世界之学院都市》、《认清现实后,她们开始追夫火葬场》、《好徒儿你就饶了为师伐》、《带着修真界仙子们天下无敌》、《剑来》、《修炼成仙的我只想养成女徒弟》、《足控勇者的目标是魔王的丝袜》、《被触手怪养大的少女》、